package com.atguigu.yygh.task.patienttask;

import com.atguigu.yygh.rabbit.consts.MqConst;
import com.atguigu.yygh.rabbit.service.RabbitService;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

//就医提醒
@Component
@EnableScheduling  //开启定时任务
public class PatientTask {
    @Autowired
    RabbitService rabbitService;
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    //指定时间表达式,当时间点到达之后,该方法就被执行
    //cron表达式,一共7位(但是在spring-task下只能用前6位)
    //quartz和springtask同类的产品,都是定时任务,都可以定义cron表达式,前者可以使用7位,后者使用6位

    /**
     * ?出现在星期,表示和星期几无关
     * 秒 分 时 日 月 星期 (年)   (年,不写第七位,默认每一年,每一位之间使用空格)
     * 0  0 20 *  *  ? 每一天晚上的8点整   @Scheduled(cron = "0 0 20 * * ?")
     * 每个月的1号,凌晨1点整  0 0 1 1 * ?
     * 每分钟内的第8秒 8 * * * * ?
     * 每分钟内的第5秒到第15秒之间,每秒执行一次 5-15 * * * * ?
     * 每分钟内的第3秒开始,每隔5秒执行一次  3/5 * * * *?
     * 每分钟内的第7,10,19秒各执行一次  7,10,19 * * * * ?
     */

    @Scheduled(cron = "8 * * * * ?")
   // @Scheduled(cron = "0 0 20 * * ?")
    public void patientTask8(){

        //redis根据key获取value
        String task_patient_tips = stringRedisTemplate.boundValueOps("task_patient_tips").get();
        //定义一个开关,如果开关成立那么就发送短信,否则不发送短信
        if("1".equalsIgnoreCase(task_patient_tips)){
            System.out.println("定时任务被开启");
            System.out.println(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            //将明天的年月日字符串作为消息发送到第四个队列上
            String date = new DateTime().plusDays(1).toString("yyyy-MM-dd");
            //mq中如果没有该交换机,定时任务服务不会自动创建(将监听的服务启动,设置了没有自动创建,才会自动创建交换机和队列)
            rabbitService.sendMessage(MqConst.TASK_EXCHANGE,MqConst.TASK_KEY,date);
        }else {
            System.out.println("定时任务被关闭");
        }
    }
}
